import sys
import pygame
from settings import Settings
from ship import *
from bullet import *

# 管理游戏资源和行为的类
class AlienInvasion:

    def __init__(self):
        # 初始化游戏并创建游戏资源
        pygame.init()
        # 初始化游戏设置
        self.settings=Settings()

        # 使用pygame创建一个显示窗口 长跟宽 各五百
        # 返回的是一个 surface 可以操作的界面

        # 全屏模式
        # self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
        # self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
        # self.settings.screen_width = self.screen.get_rect().width
        # self.settings.screen_height = self.screen.get_rect().height

        # 非全屏模式
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        # 给窗口起名字
        pygame.display.set_caption('Alien Invasion')
        # 设置背景颜色
        # self.bg_color = (230,230,230)

        # 调用飞船属性 传入 窗口的属性
        self.ship = Ship(self)

        # 将子弹编组
        self.bullets = pygame.sprite.Group()


    def _check_events(self):
        # 响应按键和鼠标事件
        for event in pygame.event.get():
            # 如果新事件的类型== pygame的退出
            if event.type == pygame.QUIT:
                # 那么就关闭系统窗口
                sys.exit()

            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

        """响应按键"""
    def _check_keydown_events(self,event):
        # 如果是 右键  right 为true
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        # 如果是 左键  left 为true
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        # 如果是 q 键 就退出
        elif event.key == pygame.K_q:
            sys.exit()
            # 如果是空格键 就执行__fire_bullet()方法
        elif event.key == pygame.K_SPACE:
            self.__fire_bullet()


        """响应松开"""
    def _check_keyup_events(self,event):
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def __fire_bullet(self):
        """"创建一颗子弹 并将其加入编组bullets中"""
        if len(self.bullets) <self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def __update_bullets(self):
        """更新子弹位置并删除消失的子弹"""
        self.bullets.update()

        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

    def _update_screen(self):
        """更新游戏中的元素 屏幕"""
        self.screen.fill(self.settings.bg_color)
        # 调用飞船的方法
        self.ship.blitme()

        # 绘制子弹
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        # 让最近绘制的屏幕可见
        pygame.display.flip()



    def run__game(self):
        # 开始游戏的主循环
        while True :
            # 响应按键和鼠标事件
            self._check_events()

            self.ship.update()

            # 更新子弹位置
            self.bullets.update()

            # 删除消失的子弹

            self.__update_bullets()

            # 更新游戏中的元素 屏幕
            self._update_screen()

# 游戏运行
if __name__=='__main__':
    # 创建游戏实例并运行游戏
    ai = AlienInvasion()
    ai.run__game()

